An input/output controller (IO controller) within a server or system exchanges information between devices. Typically, these devices are peripheral devices such as disk drives connected through the IO controller to a host computer processing unit (host CPU). By offloading the responsibility of exchanging information to the IO controller, this permits the host CPU to perform other functions.
The small computer system interface (SCSI) is a set of standards that define different transport protocols for the exchange of information from the host CPU to or from the devices such as disk drives. There are various SCSI transport protocols including PCI Express Queuing Interface (PQI) and SCSI over PCIe which is known as SOP and collectively called PQI/SOP or SCSIe. There are also other similar non-SCSI standards such as Non-volatile Memory Express (NVMe).
The typical operation of the IO controller is as follows: the IO controller retrieves a command from the host CPU for processing; the IO controller processes the command which typically comprises moving a data block from one location or device to another; when command has completed and the data has been exchanged, the IO controller sends a response to the host CPU indicating whether the exchange completed successfully or failed. Any server or system comprising an IO controller can post commands (such as IO reads or writes) to the IO controller, and can check the response from the IO controller to determine if the commands succeeded or failed.
The SCSIe and NVMe standards, among others, define a circular queuing interface for the transport of the commands and responses to and from a host CPU connected to the IO controller. Circular queues reside in the host memory space. There may be one or more circular queues in the system. When a command is received in an incoming queue, the queue is scheduled for arbitration. The arbitration scheme may be a round robin arbitration scheme. When a queue is selected for processing by the IO controller, the IO controller fetches the command from the queue and processes the command. A response from the command is then posted by the IO controller to the outgoing queue on the host CPU. After the IO controller has processed incoming commands and outgoing responses it writes to the host CPU memory to update the queue index.
The host interface is shared by both the control path and the data path. Commands and responses are transferred between the host CPU and IO controller on the same host interface or bus which the data blocks, themselves, are transferred. IO controller performance is measured by the number of data blocks per second that can be transferred successfully over the host interface or bus. Commands and responses are, essentially, overhead for data block transfers and reduce the overall performance of the IO controller.
Accordingly, it is desirable to efficiently transfer commands and responses between the host CPU and IO controller on the host interface so the transfer of data blocks has maximum bandwidth and throughput. Minimizing the impact of transferring commands and responses over the shared interface is important for improving the performance of the IO controller.
Embodiments of the present disclosure will now be described, by way of example only, with reference to the attached Figures.